#pragma once
#include<iostream>
#include<vector>
using namespace std;

enum State
{
	EMPTY,
	EXIST,
	DELETE
};

template <class K,class V>
struct HashData
{
	pair<K, V> _kv;
	State _state;
};

template <class K,class V>
class HashTable
{
public:
	bool Insert(const pair<K, V>& kv)
	{
		if (_tables.size() == 0 || 10 * size / _tables.size() >= 7)
		{
			size_t newSize = _tables.size() == 0 ? 10 : _tables.size() * 2;
			HashTable<K, V> newHT;
			newHT._tables.resize(newSize);
			for (auto e : _tables)
			{
				if (e._state == EXIST)
				{
					newHT.Insert(e._kv);
				}
			}
			_tables.swap(newHT._tables);
		}
		size_t hashi = kv.first % _tables.size();
		while (_tables[hashi]._state == EXIST)
		{
			hashi++;
			hashi %= _tables.size();
		}
		_tables[hashi]._kv = kv;
		_tables[hashi]._state = EXIST;
		++_size;
		return true;
	}
private:
	vector<HashData<K, V>> _tables;
	size_t _size = 0;
};

enum State
{
	EMPTY,
	EXIST,
	DELETE
};
template <class K,class V>
struct HashData
{
	pair<K, V> _kv;
	State _state;
};

template <class K,class V>
struct HashTable
{
public:
	bool Insert(const pair<K, V>& kv)
	{
		if (_tables.size() == 0 || 10 * _size / _tables.size() ? = 7)
		{
			size_t newSize = _tables.size() == 0 ? _tables.size() * 2;
			HashTable newHT;
			newHT._tables.resize(newSize);
			for (auto e : _tables)
			{
				if (e._state == EXIST)
				{
					newHT.Insert(e._kv);
				}
			}
			_tables.swap(newHT._tables);
		}
		hashi = kv.first % _tables.size();
		while (_tables[hashi]._state == EXIST)
		{
			hashi++;
			hashi %= _tables.size();
		}
		_tables[hashi]._kv = kv;
		_tables[hashi]._state = EXIST;
		++_size;

		return true;
	}
private:
	vector<HashData<K, V>> _tables;
	size_t _size = 0;
};

enum State
{
	EMPTY,
	EXIST,
	DELETE
};
template <class K,class V>
struct HashData
{
	pair<K, V> _kv;
	State _state;
};

template <class K,class V>
class HashTable
{
public:
	bool Insert(const pair<K, V>& kv)
	{
		if (_tables.size() == 0 || 10 * _size / _tables.size() >= 7)
		{
			size_t newSize = _tables.size() == 0 ? 10 ? _tables.size() * 2;
			HashTable newHT;
			newHT._tables.resize(newSize);
			for (auto e : _tables)
			{
				if (e._state == EXIST)
				{
					newHT._tables.insert(e._kv);
				}
			}
			_tables.swap(newHT._tables);
		}
		size_t hashi = kv.first % _tables.size();
		while (_tables[hashi]._state == EXIST)
		{
			hashi++;
			hashi %= _tables.size();
		}
		_tables[hashi]._kv = kv;
		_tables[hashi]._state = EXIST;
		_size++;

		return true;
	}
private:
	vector<HashData<K, V>> _tables;
	size_t _size = 0;
};